home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / libs / 3dvect39 / loadgif.asm < prev    next >
Assembly Source File  |  1994-10-30  |  14KB  |  611 lines

  1. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  2. ;
  3. ; Filename     : Loadgif.asm
  4. ; Included from: Main Assembley Module
  5. ; Description  : Gif and LZW decoding routines.  Written based on Rich
  6. ;                Geldreich's QBasic version.
  7. ;
  8. ; Written by: John McCarthy
  9. ;             1316 Redwood Lane
  10. ;             Pickering, Ontario.
  11. ;             Canada, Earth, Milky Way (for those out-of-towners)
  12. ;             L1X 1C5
  13. ;
  14. ; Internet/Usenet:  BRIAN.MCCARTHY@CANREM.COM
  15. ;         Fidonet:  Brian McCarthy 1:229/15
  16. ;   RIME/Relaynet: ->CRS
  17. ;
  18. ; Home phone, (905) 831-1944, don't call at 2 am eh!
  19. ;
  20. ; John Mccarthy would really love to work for a company programming Robots
  21. ; or doing some high intensive CPU work.  Hint. Hint.
  22. ;
  23. ; Send me your protected mode source code!
  24. ; Send me your Objects!
  25. ; But most of all, Send me a postcard!!!!
  26. ;
  27. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  28.  
  29.          .386p
  30.          jumps
  31.  
  32. code32   segment para public use32
  33.          assume cs:code32, ds:code32
  34.  
  35. ; define externals
  36.  
  37.          include pmode.ext              ; protected mode externals
  38.          include file.ext
  39.          include macros.inc
  40.  
  41.          public _loadgif
  42.          public _loadgif_lzw
  43.          public _loadgif_getdword
  44.          public _loadgif_getword
  45.          public _loadgif_getbyte
  46.          public _loadgif_input
  47.  
  48. _loadgif_input dd 0
  49. gifmem         dd 0
  50. palettemem     dd 0
  51. prefixmem      dd 0
  52. numcolours     dw 0                         ; number of colours in GIF
  53. nopalette      db 0                         ; global or local colour map
  54. _background    db 0                         ; _background indexer in GIF
  55. xlength        dw 0                         ; x and y size of GIF
  56. ylength        dw 0
  57.  
  58. buflen   = 128
  59. bufleft  dd 0                               ; number of bytes left in byte buffer
  60. bufptr   dd 0                               ; current buffer pointer
  61. bytebuffer db buflen dup (0)                ; buffers for load (speeds disk loading alot)
  62.  
  63. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  64. ;
  65. ; Loadgif - simple GIF decoder
  66. ; In:
  67. ;    EDX - location of free memory to put palette and decoded GIF string
  68. ;    EAX - stream input routine (In:ECX=len,EDX->buf, Out:EAX=len,CF=1 error)
  69. ;    ECX - temp storage for LZW prefixs (4096*2*3=24576 length)
  70. ; Out:
  71. ;   CF=1 - Error decoding file
  72. ;   CF=0 - File decoded succesfully
  73. ;    EBX - location of palette - if EBX = EDX, then there is no palette in GIF
  74. ;    ECX - length of decoded GIF   - might not equal x*y (should, but might not)
  75. ;    EDX - location of decoded GIF - first two words are x and y size
  76. ;     AX - number of colours in GIF
  77. ;
  78. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  79.  
  80. _loadgif:
  81.          mov _loadgif_input,eax
  82.          mov gifmem,edx
  83.          mov palettemem,edx
  84.          mov prefixmem,ecx
  85. kkjj:
  86.          call _loadgif_getdword
  87.          jc error_in_gif
  88.  
  89.          cmp eax,"8FIG"                     ; check GIF8
  90.          jne error_in_gif
  91.  
  92.          call _loadgif_getword              ; skip "7a" part of GIF
  93.          jc error_in_gif
  94.  
  95.          call _loadgif_getword              ; skip totalx
  96.          jc error_in_gif
  97.  
  98.          call _loadgif_getword              ; skip totaly
  99.          jc error_in_gif
  100.  
  101.          call _loadgif_getbyte              ; numcolours
  102.          jc error_in_gif
  103.  
  104.          push ax
  105.  
  106.          and al,7
  107.          mov cl,al
  108.          inc cl
  109.          mov ax,1
  110.          shl ax,cl
  111.          mov numcolours,ax
  112.  
  113.          pop ax
  114.          and al,128
  115.          xor al,128
  116.          mov nopalette,al
  117.  
  118.          call _loadgif_getbyte
  119.          jc error_in_gif
  120.          mov _background,al
  121.  
  122.          call _loadgif_getbyte
  123.          jc error_in_gif
  124.          cmp al,0                           ; ? "Bad screen descriptor in GIF":end
  125.          jne error_in_gif
  126.  
  127.          cmp nopalette,0
  128.          jne do05
  129.  
  130.          mov cx,numcolours
  131.          mov ax,3
  132.          mul cx                             ; ax = numcolours*3
  133.          movzx ecx,ax
  134.          mov edx,gifmem
  135.          add gifmem,ecx
  136.          push ecx
  137.          push edx
  138. morepal:
  139.          call _loadgif_getbyte
  140.          mov [edx],al
  141.          inc edx
  142.          loop morepal
  143.          pop esi
  144.          pop ecx
  145.          jc error_in_gif
  146. divloop:
  147.          shr byte ptr [esi],2               ; adjust palette from 8 bit to 6 bit
  148.          inc esi
  149.          loop divloop
  150. do05:
  151.          call _loadgif_getbyte
  152.          jc error_in_gif
  153.          cmp al,44
  154.          je exitdo
  155.          cmp al,33
  156.          jne error_in_gif                   ; ? "Unknown extension type":end
  157.  
  158.          call _loadgif_getbyte
  159.          jc error_in_gif
  160. do10:
  161.          call _loadgif_getbyte
  162.          jc error_in_gif
  163.          movzx ecx,al
  164.          jcxz do05
  165. do20:
  166.          push ecx
  167.          call _loadgif_getbyte
  168.          pop ecx
  169.          jc error_in_gif
  170.          loop do20
  171.  
  172.          jmp do10
  173. exitdo:
  174.          call _loadgif_getword              ; skip image left and top
  175.          jc error_in_gif
  176.          call _loadgif_getword
  177.          jc error_in_gif
  178.  
  179.          call _loadgif_getword
  180.          jc error_in_gif
  181.          mov xlength,ax
  182.          call _loadgif_getword
  183.          jc error_in_gif
  184.          mov ylength,ax
  185.  
  186.          call _loadgif_getbyte
  187.          jc error_in_gif
  188.          test al,128+64
  189.          jnz error_in_gif                   ; ? "Can't handle local colormaps or interlaced GIFs":end
  190.  
  191.          mov edx,gifmem
  192.          mov ax,xlength                     ; set x and y size as first two words in decoded file
  193.          mov [edx],ax
  194.          mov ax,ylength
  195.          mov [edx+2],ax
  196.  
  197.          add edx,4
  198.          mov eax,_loadgif_input
  199.          mov ecx,prefixmem
  200.          call _loadgif_lzw
  201.  
  202.          mov edx,gifmem
  203.          mov ebx,palettemem
  204.          mov ax,numcolours
  205.          ret
  206.  
  207. error_in_gif:
  208.          mov bufleft,0
  209.          mov bufptr,0
  210.          stc
  211.          ret
  212.  
  213. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  214. ;
  215. ; Decode_LZW - simple LZW decoder
  216. ; In:
  217. ;    ECX - temp storage for LZW prefixs (4096*2*3=24576 length)
  218. ;    EDX - memory location for decoded file
  219. ;    EAX - stream input routine (In:ECX=len,EDX->buf, Out:EAX=len,CF=1 error)
  220. ; Out:
  221. ;   CF=1 - Error decoding file
  222. ;   CF=0 - File decoded succesfully
  223. ;    ECX - length of decoded file
  224. ;    EDX - memory location of decoded file
  225. ;
  226. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  227.  
  228. clearcode     dd 0
  229. eoscode       dd 0
  230. firstcode     dd 0
  231. nextcode      dd 0
  232. startmaxcode  dd 0
  233. maxcode       dd 0
  234. startcodesize dd 0
  235. codesize      dd 0
  236. curcode       dd 0
  237. lastcode      dd 0
  238. lastpixel     dd 0
  239. lastchar      dd 0
  240. stackpointer  dd 0
  241. codex         dd 0
  242.  
  243. bitsin        dd 0
  244. blocksize     dd 0
  245. blockpointer  dd 0
  246. decodemem     dd 0
  247. decodememsav  dd 0
  248.  
  249. prefix   dd 0
  250. suffix   dd 0
  251. outstack dd 0
  252. ybase    dd 0
  253. workcode dd 0
  254. spaces   db 256 dup (0)
  255.  
  256. _loadgif_lzw:
  257.          mov _loadgif_input,eax
  258.          mov decodemem,edx
  259.          mov decodememsav,edx               ; save starting code location
  260.  
  261.          mov prefix,ecx
  262.          add ecx,4096*2
  263.          mov suffix,ecx
  264.          add ecx,4096*2
  265.          mov outstack,ecx
  266.  
  267.          call init_decode
  268.          jc error_in_decode
  269.  
  270.          call decode0
  271.          jc error_in_decode
  272.  
  273.          mov edx,decodememsav
  274.          mov ecx,decodemem
  275.          sub ecx,edx
  276.          clc
  277.          mov bufleft,0
  278.          mov bufptr,0
  279.          ret
  280.  
  281. error_in_decode:
  282.          mov bufleft,0
  283.          mov bufptr,0
  284.          stc
  285.          ret
  286.  
  287. shiftout dd 128
  288.          dd 64
  289.          dd 32
  290.          dd 16
  291.          dd 8
  292.          dd 4
  293.          dd 2
  294.          dd 1
  295.  
  296. powersof2 dd 1
  297.          dd 2
  298.          dd 4
  299.          dd 8
  300.          dd 16
  301.          dd 32
  302.          dd 64
  303.          dd 128
  304.          dd 256
  305.          dd 512
  306.          dd 1024
  307.          dd 2048
  308.  
  309. init_decode:
  310.          call _loadgif_getbyte
  311.          jc error_in_decode
  312.          mov edx,eax
  313.          mov eax,powersof2[eax*4]
  314.          mov clearcode,eax
  315.          mov eoscode,eax
  316.          add eoscode,1
  317.          mov firstcode,eax
  318.          add firstcode,2
  319.          mov nextcode,eax
  320.          add nextcode,2
  321.          mov startcodesize,edx
  322.          inc startcodesize
  323.          mov codesize,edx
  324.          inc codesize
  325.          mov ebx,powersof2[edx*4+4]
  326.          dec ebx
  327.          mov startmaxcode,ebx
  328.          mov maxcode,ebx
  329.  
  330.          mov bitsin,0
  331.          mov blocksize,0
  332.          mov blockpointer,1
  333.  
  334.          ret
  335. decode0:
  336.          call getcode
  337.          jc error_in_decode
  338.  
  339.          mov eax,codex
  340.          cmp eax,eoscode
  341.          je end_of_decode
  342.  
  343.          mov eax,codex
  344.          cmp eax,clearcode
  345.          jne else0
  346.  
  347.          mov ebx,firstcode
  348.          mov nextcode,ebx
  349.          mov ebx,startcodesize
  350.          mov codesize,ebx
  351.          mov ebx,startmaxcode
  352.          mov maxcode,ebx
  353.          call getcode
  354.          jc error_in_decode
  355.          mov eax,codex
  356.          mov curcode,eax
  357.          mov lastcode,eax
  358.          mov lastpixel,eax
  359.  
  360.          mov edx,decodemem
  361.          mov [edx],al
  362.          inc decodemem
  363.  
  364.          jmp level0
  365.  
  366. else0:
  367.          mov curcode,eax
  368.          mov stackpointer,0
  369.  
  370.          cmp eax,nextcode
  371.          ja error_in_decode
  372.          jne dowhile1
  373.  
  374.          mov ebx,lastcode
  375.          mov curcode,ebx
  376.  
  377.          mov ecx,stackpointer
  378.          mov ebx,lastpixel
  379.          mov edi,outstack
  380.          mov [edi+ecx*2],bx                 ; outstack(stackpointer)=lastpixel
  381.  
  382.          inc stackpointer
  383.  
  384. dowhile1:
  385.          mov ebx,curcode
  386.          cmp ebx,firstcode
  387.          jl doneloop1
  388.  
  389.          mov ebp,curcode
  390.          mov edi,suffix
  391.          mov bx,[ebp*2+edi]
  392.          mov ebp,stackpointer
  393.          mov edi,outstack
  394.          mov [edi+ebp*2],bx
  395.  
  396.          inc stackpointer
  397.  
  398.          mov ebp,curcode
  399.          mov edi,prefix
  400.          xor ebx,ebx
  401.          mov bx,[ebp*2+edi]
  402.          mov curcode,ebx
  403.  
  404.          jmp dowhile1
  405.  
  406. doneloop1:
  407.          mov ebx,curcode
  408.          mov lastpixel,ebx
  409.  
  410.          mov ebx,lastpixel
  411.          mov edi,decodemem
  412.          mov [edi],bl
  413.          inc decodemem
  414.  
  415.          mov ecx,stackpointer
  416.          dec ecx
  417.          cmp ecx,-1
  418.          je outfornext
  419.  
  420. fornextloop:
  421.          mov esi,outstack
  422.          mov bx,[esi+ecx*2]
  423.          mov edi,decodemem
  424.          mov [edi],bl
  425.          inc decodemem
  426.  
  427.          dec ecx
  428.          cmp ecx,-1
  429.          jne fornextloop
  430.  
  431. outfornext:
  432.          cmp nextcode,4096
  433.          jae endif2
  434.  
  435.          mov ebx,lastcode
  436.          mov ecx,nextcode
  437.          mov edi,prefix
  438.          mov [edi+ecx*2],bx
  439.          mov ebx,lastpixel
  440.          mov edi,suffix
  441.          mov [edi+ecx*2],bx
  442.  
  443.          inc nextcode
  444.  
  445.          cmp codesize,12
  446.          jae endif2
  447.  
  448.          mov ecx,nextcode
  449.          cmp ecx,maxcode
  450.          jbe endif2
  451.  
  452.          inc codesize
  453.          shl maxcode,1
  454.          inc maxcode
  455. endif2:
  456.  
  457.          mov ebx,codex
  458.          mov lastcode,ebx
  459.  
  460. level0:
  461.          mov eax,codex
  462.          cmp eax,eoscode
  463.          jne decode0
  464.  
  465. end_of_decode:
  466.          clc
  467.          ret
  468.  
  469. getcode:
  470.          cmp bitsin,0
  471.          jne nogetbuf
  472.  
  473.          call getbufferedbyte
  474.          jc error_in_decode
  475.  
  476.          mov lastchar,eax
  477.          mov bitsin,8
  478. nogetbuf:
  479.          mov edx,bitsin
  480.          mov ecx,shiftout[edx*4-4]
  481.          mov eax,lastchar
  482.          cdq
  483.          div ecx
  484.          mov workcode,eax
  485. dowhile3:
  486.          mov eax,codesize
  487.          cmp eax,bitsin
  488.          jle exitdo2
  489.  
  490.          call getbufferedbyte
  491.          jc error_in_decode
  492.  
  493.          mov lastchar,eax
  494.  
  495.          mov ecx,bitsin
  496.          mov ebx,powersof2[ecx*4]
  497.          mul ebx
  498.          or workcode,eax
  499.  
  500.          add bitsin,8
  501.          jmp dowhile3
  502.  
  503. exitdo2:
  504.          mov eax,codesize
  505.          sub bitsin,eax
  506.  
  507.          mov eax,maxcode
  508.          and eax,workcode
  509.          mov codex,eax
  510.  
  511.          clc
  512.          ret
  513.  
  514. getbufferedbyte:
  515.          mov eax,blockpointer
  516.          cmp eax,blocksize
  517.          jle endif3
  518.  
  519.          call _loadgif_getbyte
  520.          jc error_in_decode
  521.  
  522.          mov blocksize,eax
  523.  
  524.          mov ecx,eax
  525.          mov edx,offset spaces
  526. getmorepal:
  527.          call _loadgif_getbyte
  528.          mov [edx],al
  529.          inc edx
  530.          loop getmorepal
  531.  
  532.          mov blockpointer,1
  533. endif3:
  534.          xor eax,eax
  535.          mov ecx,blockpointer
  536.          mov al,spaces[ecx-1]
  537.          inc blockpointer
  538.          clc
  539.          ret
  540.  
  541. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  542. ;
  543. ; Getdword - get dword from open file (self buffered)
  544. ; Getword  - get  word from open file (self buffered)
  545. ; Getbyte  - get  byte from open file (self buffered)
  546. ;
  547. ; In:
  548. ;    _loadgif_input - stream input routine (In:ECX=len,EDX->buf, Out:EAX=len,CF=1 error)
  549. ; Out:
  550. ;   CF=1 - Error reading file
  551. ;     EAX - ?
  552. ;   CF=0 - Read went fine
  553. ;     EAX - dword from file
  554. ;
  555. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  556.  
  557. _loadgif_getdword:
  558.          push ecx
  559.          xor ecx,ecx
  560.          call _loadgif_getbyte
  561.          jc retpopx
  562.          mov cl,al
  563.          call _loadgif_getbyte
  564.          jc retpopx
  565.          mov ch,al
  566.          call _loadgif_getbyte
  567.          jc retpopx
  568.          shl eax,16
  569.          or ecx,eax
  570.          call _loadgif_getbyte
  571.          jc retpopx
  572.          shl eax,24
  573.          or eax,ecx
  574.          pop ecx
  575.          ret
  576.  
  577. _loadgif_getword:
  578.          push ecx
  579.          xor ecx,ecx
  580.          call _loadgif_getbyte
  581.          jc retpopx
  582.          mov cl,al
  583.          call _loadgif_getbyte
  584.          jc retpopx
  585.          mov ch,al
  586.          mov ax,cx
  587. retpopx:
  588.          pop ecx
  589.          ret
  590.  
  591. _loadgif_getbyte:
  592.          dec bufleft
  593.          cmp bufleft,0
  594.          jg gb_ok
  595.          push ecx edx
  596.          mov edx,offset bytebuffer
  597.          mov ecx,buflen
  598.          mov bufptr,0
  599.          call [_loadgif_input]
  600.          mov bufleft,ecx
  601.          pop edx ecx
  602. gb_ok:
  603.          mov eax,bufptr
  604.          movzx eax,byte ptr bytebuffer[eax]
  605.          inc bufptr
  606.          clc
  607.          ret
  608.  
  609. code32   ends
  610.          end
  611.